package pildemil

import javax.jdo.PersistenceManager


class TransactionService {

    static transactional = true
	
	public void calculTransactions(Projet projet) {
			
		def algo = new Algo(projet)
		algo.init()
		algo.calcul()
		//algo.afficher()
		
		// récupération des transactions
		projet.transactions = algo.transaction(projet)
	}
	
	public void calculMaj(Projet projet) {
		calculRatioDepenses(projet)
		calculDepenseEtConso(projet)
		calculDifferentiels(projet)
	}
	
	private void calculRatioDepenses(Projet projet) {
		
		projet.depenses.each { depense ->
			int totalPart = 0
			depense.consommateurs.each { consommateursKey ->
				projet.participants.each { participant ->
					if (consommateursKey == participant.key) {
						totalPart += participant.part			
					}
				}
			}
			depense.ratioParticipantVal = Math.round((float)depense.montantVal / (float)totalPart)
		}
	}
	
	private void calculDepenseEtConso(Projet projet) {
			
		// initialisation des depenses et conso des participants
		projet.participants.each { participant ->
			participant.totalConsommationVal = 0
			participant.totalDepenseVal = 0
		}
		
		projet.depenses.each { depense ->
				
			// pour tous les consommateurs
			int reste = depense.montantVal
			Participant dernier = null
			depense.consommateurs.each { consommateursKey ->
				projet.participants.each { participant ->
					if (consommateursKey == participant.key) {
						 int consommation = participant.part * depense.ratioParticipantVal
						 participant.totalConsommationVal += consommation
						 reste -= consommation
						 dernier = participant
					}
				}
			}
			if(dernier != null) {
				dernier.totalConsommationVal += reste
			}
			
			// pour le payeur
			projet.participants.each { participant ->
                if (depense.payeur == participant.key) {
                        participant.totalDepenseVal += depense.montantVal
                }
			}
		}
	}
		
	private void calculDifferentiels(Projet projet) {		
		projet.participants.each { participant ->
				participant.differentielVal = participant.totalDepenseVal - participant.totalConsommationVal
		}
	}
}
